package nespresso.beans;

import org.apache.commons.mail.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.text.*;

public class EnvoiMail {
        private Email email;
        private String smtpServeur;
        private String smtpPort;
        private String smtpUser;
        private String smtpPass;
        private String urlSite;
        private String smtpFrom;
        private Log log;
        
        public EnvoiMail(User u, User to, String action) {
                log = LogFactory.getLog(EnvoiMail.class);
                email = new SimpleEmail();
                Base bp = new Base();
                
                bp.GetResultat("PARAMETRES", "param_name", "smtp_port"); bp.Suivant();
                smtpPort = new String(bp.GetTexte("param_value"));
                bp.GetResultat("PARAMETRES", "param_name", "smtp_server"); bp.Suivant();
                smtpServeur = new String(bp.GetTexte("param_value"));
                bp.GetResultat("PARAMETRES", "param_name", "smtp_user"); bp.Suivant();
                smtpUser = new String(bp.GetTexte("param_value"));              
                bp.GetResultat("PARAMETRES", "param_name", "smtp_pass"); bp.Suivant();
                if(bp.GetBoolean("param_crypt")) {
                        Base bparam = new Base();
                        bparam.ExecuteRequete("SELECT AES_DECRYPT(param_value,'NESPRESSO') AS pv FROM PARAMETRES WHERE param_name='smtp_pass'");
                        bparam.Suivant();
                        smtpPass = bparam.GetTexte("pv");
                        bparam.Free();
                } else  smtpPass = new String(bp.GetTexte("param_value"));
                bp.GetResultat("PARAMETRES", "param_name", "url_site"); bp.Suivant();
                urlSite = new String(bp.GetTexte("param_value"));
                bp.GetResultat("PARAMETRES", "param_name", "smtp_from"); bp.Suivant();
                smtpFrom = new String(bp.GetTexte("param_value"));
                
                try {
                        email.setHostName(smtpServeur);
                        email.setSmtpPort(Integer.parseInt(smtpPort));
                        email.setAuthenticator(new DefaultAuthenticator(smtpUser, smtpPass));
                        email.setTLS(true);
                        email.setFrom(smtpFrom);
                        if(action.equals("BIENVENUE")) {
                                email.setSubject("Appli Nespresso : Bienvenue " + u.getPrenom());
                                email.setMsg("Bonjour " + u.getPrenom() + "," + (char)13 + (char)13 + "Merci pour votre inscription à l'appli Nespresso." + (char)13 + (char)13 + "Votre compte a bien été créé :" + (char)13 + "Login : " + u.getLogin() + (char)13 + (char)13 + "L'appli Nespresso est accessible à l'adresse suivante : " + urlSite + (char)13 + (char)13 + "Bonne dégustation !");
                                email.addTo(u.getEmail());
                                email.send();
                                log.info("Mail de bienvenue envoyé à "+ u.getLogin()+" avec succès !");
                        }
                        if(action.equals("NEWCOMMANDE")) {
                                email.setSubject("Appli Nespresso : Nouvelle commande initiée par " + u.getPrenom() + " " + u.getNom());
                                email.setMsg("Bonjour " + to.getPrenom() + "," + (char)13 + (char)13 + u.getPrenom()+" "+u.getNom()+" a créé une nouvelle commande." + (char)13 + (char)13 + "Vous pouvez en profiter pour passer commande de capsules Nespresso à l'adresse : "  + urlSite + " . Un mail vous avertira de la fin de la prise de commandes." + (char)13 + (char)13 + "Bonne dégustation !");
                                email.addTo(to.getEmail());
                                email.send();
                                log.info("Notification de nouvelle commande envoyée à "+ to.getLogin()+" avec succès !");
                        }
                        if(action.startsWith("ENCOMMANDE")) {
                                String numcommande = new String(action.substring(10));
                                email.setSubject("Appli Nespresso : La commande N° " + numcommande + " a évolué vers le statut "+(char)34+"EN COMMANDE"+(char)34+".");
                                email.setMsg("Bonjour " + to.getPrenom() + "," + (char)13 + (char)13 + "La commande N° " + numcommande + " a évolué vers le statut "+(char)34+"EN COMMANDE"+(char)34+"." + (char)13 + (char)13 + "Si vous souhaitez commander des capsules Nespresso, vous devez créer une nouvelle commande à l'adresse "  + urlSite + " ." + (char)13 + (char)13 + "Bonne dégustation !");
                                email.addTo(to.getEmail());
                                email.send();
                                log.info("Notification du statut EN COMMANDE commande envoyée à "+ to.getLogin()+" avec succès !");
                        }
                        if(action.startsWith("LIVREE")) {
                                String numcommande = new String(action.substring(6));
                                float totligne = 0;
                                float mligne;
                                Base bl = new Base(); // On va rechercher les lignes de commande du user et les afficher dans le mail
                                Base bc = new Base();
                                String message = new String("Bonjour " + to.getPrenom() + "," + (char)13 + (char)13 + "La commande N° " + numcommande + " a évolué vers le statut "+(char)34+"LIVRÉE"+(char)34+"." + (char)13 + (char)13 + "Merci de vous rendre dans le bureau de "  + u.getPrenom()+" "+u.getNom() + " pour récupérer vos capsules." + (char)13 + (char)13);
                                message = message + "Votre Commande :"+(char)13;
                                bl.GetResultat("LIGNESCDE", new String[]{"ID_COMMANDE","ID_USER"}, new String[]{numcommande,to.getId()});
                                while(bl.Suivant()) {
                                        mligne = bl.GetReel("MONTANT");
                                        bc.GetResultat("CAPSULES", "ID", bl.GetTexte("ID_CAPSULE")); bc.Suivant();
                                        message = message + "- "+String.valueOf(bl.GetEntier("NOMBRE"))+" "+bc.GetTexte("NOM")+(char)9+(char)9+new DecimalFormat("0.00").format(mligne)+(char)13;
                                        totligne = totligne + mligne;
                                }
                                message = message + "Votre total :"+(char)9+(char)9+(char)9+(char)9+new DecimalFormat("0.00").format(totligne)+" à régler à "+u.getPrenom()+" "+u.getNom()+(char)13+(char)13+" Bonne dégustation !";
                                email.setSubject("Appli Nespresso : La commande N° " + numcommande + " a évolué vers le statut "+(char)34+"LIVRÉE"+(char)34+".");
                                email.setMsg(message);
                                email.addTo(to.getEmail());
                                email.send();
                                log.info("Notification du statut LIVRÉE envoyée à "+ to.getLogin()+" avec succès !");
                        }   
                        if(action.startsWith("REGLEMENT")) {
                            String numcommande = new String(action.substring(9));
                            Base bpai = new Base(); // On va rechercher la ligne du paiement concerné
                            bpai.GetResultat("PAIEMENTS", new String[]{"ID_COMMANDE","ID_USER"}, new String[]{numcommande,u.getId()});
                            bpai.Suivant();
                            String message = new String("Bonjour " + to.getPrenom() + "," + (char)13 + (char)13 + u.getPrenom()+" "+u.getNom()+" a enregistré son réglement d'un montant de "+String.valueOf(bpai.GetReel("MONTANT"))+ " € pour la commande N° " + numcommande + "." + (char)13 + (char)13 + "Si vous avez effectivement reçu ce réglement, merci de le valider dans l'application : ");
                            message = message + urlSite + (char)13 + (char)13 + "Cordialement," ;

                            email.setSubject("Appli Nespresso : " + u.getPrenom() + " " + u.getNom() + " a enregistré un réglement pour la commande " + numcommande);
                            email.setMsg(message);
                            email.addTo(to.getEmail());
                            email.send();
                            log.info("Notification de l'enregistrement d'un réglement de "+u.getLogin()+" à "+ to.getLogin()+" réalisée avec succès !");
                        }
                        if(action.startsWith("VALIDREGLEMENT")) {
                        	String numcommande = new String(action.substring(14));
                        }
                } catch(Exception e) {
                        log.error("Erreur lors de l'envoi du mail : " + e.getMessage());
                }
        }
}